; 'use strict'; /** * * Filmdepo pleer * */ function FDPleer(video, type) { var T = this; /** * Параметры плеера */ T.params = { type: null, //тип плеера fullscreen: null, //статус фуллскрина volume: null, //громкость по-умолчанию (кнопка mute не влияет) video: video, //текущее видео video_id: null, //идентификатор видео video_src: null, //source у видео video_poster_src: null, //путь к постеру video_params: null, //параметры видео advert_params: null, //хмл с рекламы current_time: null, //текущее время видео в секундах advert_src: null, //source у рекламы advert_playing: false, //проигрывается рекламный преролл localstorage: null, //локальное хранилище - хранит звук timecounter: null, //счетчик времени // url_ad: '//rose.ixbt.com/vast_max.php', // url_ad: 'http://ixbt.video/cgi-bin/banqs.cgi?place_id=2', url_ad: '//rose.ixbt.com/vast_min.php', //хмл с рекламой url_params: '//ixbt.video/cgi-bin/ajax.pl?option=webcast_info&id=' //получение данных по видео }; /** * Ноды, используемые в плеере */ T.nodes = { outer: null, //общий контейнер - .fd-container poster: null, //постер - .fd-poster wrapper: null, //враппер плеера - .fd-wrapper video_container: null, //контейнер видео - .fd-video failcap: null, //заглушка при ошибках - .fd-failcap ad_skip: null, //кнопка скипа рекламы - .fd-ad-skip top_nav: null, //меню в дополнительном - .fd-top-nav play_button: null, //большая кнопка плэй - .fd-icon-big-play video_title: null, //заголовок видео - .fd-toptitle afterlinks: null, //ссылки после просмотра видео - .fd-afterlinks replay_after: null, //кнопка реплэя - .fd-replay_please bottom_nav: null, //полоска снизу - .fd-bottom-nav hover_timestamp: null //время при наведении на полосу - .fd-bottom-nav-seekbar--hovertime }; /** * Билдит дом-дерево */ T.build = { controls: null, //построить контролы управления data_advert: null, //получить и распарсить данные по рекламе data_video: null, //получить и распарсить данные по видео fail_cap: null, //заглушка при ошибке wrapper: null //построить враппер у видео }; /** * Функции конвертации */ T.convert = { clickToPercent_height: null, //высота клика относительно высоты контейнера - используется для громкости clickToPercent_width: null, //тоже самое, но по ширине - полоса воспроизведения hasClass: null, //есть класс у ноды или нет isVisible: null, //виден ли элемент numToPercent: null, //получить процент percentToSec: null, //проценты в секунды positionToPixels: null, //вернуть позицию элемента относительно body removeClass: null, //удалить класс set_innerText: null, //добавить текст в ноду secToTime: null, //s -> mm:ss timeToSec: null //mm:ss -> s }; /** * Функции обработки внутренних данных */ T.data = { browserSupport: null, //поддержка браузером видео fail: null, //эксепшен после фэйла в получении данных get: null, //получить данные и вернуть в коллбэк isEmbedded: null, //? вставка через iframe isFullscreen: null, //? полноэкранный режим isMobile: null, //? пользователь на телефоне/планшете send_ad_event: null, //дернуть рекламу storage: null //доступ к window.localStorage }; /** * Вешает хэндлеры */ T.handlers = { add: null //повесить хэндлеры }; /** * Функции манипуляций с домом */ T.nodefunction = { ad_skip: null, //скипнуть рекламу afterlinks: null, //показать ссылки после просмотра видео changeWrapperFullscreenClass: null, //изменить класс при фуллскрине у контейнера hoverControls: null, //скрыть/показать контролы при ховере title: null, //заголовок показать/скрыть toggleFullscreen: null, //фуллскрин toggleRealSize: null, //реальный размер toggleSettings: null, //настройки (кнопка "дополнительно") video: null, //видео - пауза/плэй volume: null, //звук - гет/сет volumeContainerVisibility: null //видимость контейнера со звуком }; // TODO hasClass: "Добавить поддержку снятия display у цсс" /** * ПОЕХАЛИ: */ /** T.DATA */ /** * Получить данные аяксом * @param callback * @param url * @param type * @param fail_type */ T.data.get = function (callback, path, type, fail_type) { var isIE8 = window.XDomainRequest ? true : false; var invocation = createCrossDomainRequest(); var url = path; function createCrossDomainRequest(url, handler) { var request; if (isIE8) { request = new window.XDomainRequest(); } else { request = new XMLHttpRequest(); } return request; } function handler(evtXHR) { if (invocation.readyState == 4) { if (invocation.status == 200) { outputResult(); } else { console.log("Filmdepo Pleer: ответ не 200"); T.build.fail_cap('Что-то пошло не так. Перезагрузите страницу для просмотра'); } } } function outputResult() { var response = invocation.responseText; if (callback) callback(response); } if (invocation) { if(isIE8) { invocation.onload = outputResult; invocation.open("GET", url, true); invocation.send(); } else { invocation.open('GET', url, true); invocation.onreadystatechange = handler; invocation.send(); } } else { console.log("Filmdepo Pleer: Браузер не поддерживает XMLHttpRequest"); T.build.fail_cap('Что-то пошло не так. Перезагрузите страницу для просмотра'); } }; /** * Сохранить в локасторадже (уровень громкости) */ T.data.storage = { get: function(key) { return T.params.localstorage.getItem(key); }, isExists: function(key) { return !!T.params.localstorage.getItem(key); }, set: function(key, value){ T.params.localstorage.setItem(key, value); }, remove: function(key) { delete T.params.localstorage.removeItem(key) } }; /** * Дернуть урл по клику на рекламу * @param type */ T.data.send_ad_event = function(type){ T.data.get('', T.params.advert_events[type], 'get', ''); }; /** * Эксепшен после фэйла в получении данных */ T.data.fail = function (type) { if (type === 'normal') { alert('Произошла ошибка :(') } console.log('Filmdepo Pleer: Проблемы с отправкой ajax-запроса'); }; /** * Подержка видео у пользователя */ T.data.browserSupport = function () { var video_sources, video_status, i = 0, canplay = true; video_status = !!document.createElement('video').canPlayType; video_sources = T.params.video.querySelectorAll('source'); if (!video_status) return false; [].forEach.call(video_sources, function(el) { var type = el.getAttribute('type'); if (document.createElement('video').canPlayType(type).replace('/no/', '')) { canplay = canplay || true; } }); return (video_status && canplay); }; /** * В полноэкранном режиме или нет * @returns {boolean} */ T.data.isFullscreen = function () { return !!(document.fullScreen || document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement || document.fullscreenElement); }; /** * Пользователь с мобильника или нет * @returns {boolean} */ T.data.isMobile = function () { var check = false; (function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)))check = true })(navigator.userAgent || navigator.vendor || window.opera); return check; }; /** * Встроенное видео или нет * @return {boolean} */ T.data.isEmbedded = function(){ return T.params.type === 'embedded' ? true : false; }; /** T.CONVERT */ /** * Кросс-браузерно - innerText * @param elem * @param val */ T.convert.set_innerText = function(elem, val){ if (typeof elem.textContent !== "undefined") { elem.textContent = val; } else { elem.innerText = val; } }; /** * Видимость элемента * @param el * @returns {boolean} */ T.convert.isVisible = function(el) { return el.style.display !== 'none'; }; /** * Удалить класс * @param node * @param classname * @returns {string} - строка с классами без classname */ T.convert.removeClass = function (node, classname) { var class_array, i; class_array = node.className.split(' '); for (i = 0; class_array.length > i; i++) { if (class_array[i] === classname.toString()) { class_array.splice(i, 1); } } return class_array.join(' '); }; /** * Наличие класса * @param element * @param className * @returns {boolean} */ T.convert.hasClass = function (element, className) { return (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(" " + className + " ") > -1; }; /** * Время в секунды * @param time - MM:SS * @returns sec - секунды */ T.convert.timeToSec = function (time) { var t = time.split(':'); if (t.length === 3) { return ((t[0] * 3600) + (t[1] * 60) + (parseInt(t[2]))); } else if (t.length === 2) { return ((t[0] * 60) + (parseInt(t[1]))); } else { console.log('неправильный формат времени'); } }; /** * Секунды во время * @param s - секунды * @returns {*} - MM:SS */ T.convert.secToTime = function (s) { var time, h, m; time = parseInt(s); // h = Math.floor(time / 3600); // time -= h * 3600; m = Math.floor(time / 60); time -= m * 60; // return (h < 10 ? '0' + h : h) + ":" + (m < 10 ? '0' + m : m) + ":" + (time < 10 ? '0' + time : time); return (m < 10 ? '0' + m : m) + ":" + (time < 10 ? '0' + time : time); }; /** * Получить проценты от числа * @param sec - секунды * @param total - всего секунд * @returns {*} - проценты */ T.convert.numToPercent = function (sec, total) { return sec * 100 / total; }; /*** * Получить ширину контейнера и вычислить в процентах место клика от общей ширины контейнера * @param e * @param t - this * @returns {*} - проценты */ T.convert.clickToPercent_width = function (e, t) { var cursor_position, element_width; cursor_position = e.pageX - T.convert.positionToPixels(t).left; element_width = t.offsetWidth; return T.convert.numToPercent(cursor_position, element_width); }; /*** * Получить ширину контейнера и вычислить в процентах место клика от общей высоты контейнера * @param e * @param t - this * @returns {*} - проценты */ T.convert.clickToPercent_height = function(e, t){ var cursor_position, element_width; cursor_position = e.pageY - T.convert.positionToPixels(t).top; element_width = t.offsetHeight; return T.convert.numToPercent(element_width - cursor_position, element_width); }; /** * Проценты в секунды * @param percent - проценты * @param total - всего секунд * @returns {*} - секунды */ T.convert.percentToSec = function (percent, total) { return total * percent / 100; }; /** * Вернуть позицию элемента относительно body * @param el * @returns {{top: number, left: number}} */ T.convert.positionToPixels = function (el) { return { top: el.getBoundingClientRect().top + (document.documentElement.scrollTop || document.body.scrollTop), left: el.getBoundingClientRect().left }; }; /** T.BUILD */ /** * Построить обертку для видеоплеера * @param video - видео */ T.build.wrapper = function (video, type) { T.params.type = type; T.params.video = video; T.params.current_time = 0; T.params.video_id = video.getAttribute('data-webcast'); T.params.video_poster_src = video.getAttribute('poster'); if(!T.params.video_poster_src || T.params.video_poster_src == '//ixbt.video/'){ T.params.video_poster_src = '//ixbt.video/resources/templates/1/img/indian-stand-by.jpg'; video.setAttribute('poster', T.params.video_poster_src); } T.params.video.setAttribute('webkit-playsinline', ''); T.params.video.setAttribute('preload', 'metadata'); T.params.localstorage = localStorage; function posterVisibility() { var t; t = setInterval(function () { if (poster_img.complete) { T.nodes.outer.className += ' ready'; poster_img.style.visibility = 'visible'; T.nodes.poster.appendChild(poster_img); T.nodes.outer.style.display = 'block'; T.nodes.poster.style.display = 'block'; T.params.video.style.display = 'block'; poster_img.removeEventListener('load', posterVisibility, false); poster_img = null; clearInterval(t); } }, 200); } var poster_img; T.nodes.outer = document.createElement('div'); T.nodes.outer.setAttribute('class', 'fd-container'); T.nodes.wrapper = document.createElement('div'); T.nodes.wrapper.setAttribute('class', 'fd-wrapper'); T.nodes.wrapper.className += T.data.isMobile() ? ' mobile' : ' not-mobile'; T.nodes.wrapper.className += T.data.isEmbedded() ? ' embedded' : ''; T.nodes.video_container = document.createElement('div'); T.nodes.video_container.setAttribute('class', 'fd-video'); T.nodes.poster = document.createElement('div'); T.nodes.poster.setAttribute('class', 'fd-poster'); T.nodes.poster.style.display = 'none'; video.parentNode.insertBefore(T.nodes.video_container, video.nextSibling); T.nodes.video_container.appendChild(video); T.nodes.wrapper.appendChild(T.nodes.poster); T.nodes.video_container.parentNode.insertBefore(T.nodes.wrapper, T.nodes.video_container); T.nodes.wrapper.appendChild(T.nodes.video_container); T.nodes.wrapper.parentNode.insertBefore(T.nodes.outer, T.nodes.wrapper); T.nodes.outer.appendChild(T.nodes.wrapper); poster_img = new Image(); poster_img.setAttribute('alt', ''); poster_img.src = T.params.video_poster_src; poster_img.addEventListener('load', posterVisibility, false); if (!T.data.browserSupport()) { T.build.fail_cap('Ваш браузер не поддерживает воспроизведение видео'); return false; } T.data.get(T.build.data_advert, T.params.url_ad, 'get', 'normal'); }; /** * Повесить заглушку с ошибкой */ T.build.fail_cap = function (text) { T.nodes.failcap = document.createElement('div'); T.nodes.failcap.setAttribute('class', 'fd-failcap'); T.nodes.failcap.innerHTML = '' + '' + '

'+text+'

'; T.nodes.wrapper.appendChild(T.nodes.failcap); return false; }; /** * Получить и распарсить данные по рекламе * @param r */ T.build.data_advert = function (r) { var parser, parseAdvertEvents, xml, video_sources, video_sources_string = '', i = 0; parseAdvertEvents = function(el){ var obj, paramslist, i = 0; obj = {}; paramslist = el.getElementsByTagName('TrackingEvents')[0].getElementsByTagName('Tracking'); while (paramslist.length > i) { var t; t = paramslist[i]; obj[t.getAttribute('event')] = t.childNodes[0].nodeValue; i++; } obj['clickThrough'] = el.getElementsByTagName('VideoClicks')[0].getElementsByTagName('ClickThrough')[0].childNodes[0].nodeValue; T.params.advert_events = obj; }; video_sources = T.params.video.getElementsByTagName('source'); parser = new DOMParser(); xml = parser.parseFromString(r, 'text/xml'); while(video_sources.length > i) { var t = video_sources[i]; video_sources_string += ' '; i++; } T.params.advert_params = xml.getElementsByTagName('Ad')[0]; T.params.video_src = video_sources_string; if (T.params.advert_params) { var i = 0, mf = T.params.advert_params.getElementsByTagName('MediaFile'), mf_l = mf.length, arr = [] ; while (mf_l > i) { var str = ''; arr.push(str); i++; } parseAdvertEvents(T.params.advert_params); T.params.advert_src = arr; T.params.video.innerHTML = T.params.advert_src.join(' '); T.params.video.load(); T.params.advert_playing = true; } T.data.get(T.build.data_video, T.params.url_params + T.params.video_id, 'get', 'normal'); }; /** * Получить и распарсить данные по видео * @param r */ T.build.data_video = function (r) { T.params.video_params = JSON.parse(r); T.build.controls(); T.params.fullscreen = false; T.nodefunction.changeWrapperFullscreenClass(T.params.fullscreen); if (T.data.storage.isExists('fd-volume')) { T.params.volume = parseFloat(T.data.storage.get('fd-volume')); } else { T.params.volume = 1; T.data.storage.set('fd-volume', T.params.volume, 365); } }; /*** * Построить контролы у видеo */ T.build.controls = function () { var controls_fragment = document.createDocumentFragment(); function icon_prefix(name) { return 'fd-icon icon-' + name; } function get_pars(type) { return '' + T.params.video_params[type]; } function sharingLinks(type) { if (type === 'fb') return 'https://www.facebook.com/sharer/sharer.php?u=http://ixbt.video/' + T.params.video_id + '.html'; if (type === 'vk') return 'https://vk.com/share.php?url=http://ixbt.video/' + T.params.video_id + '.html'; if (type === 'tw') return 'https://twitter.com/intent/tweet?text=' + T.params.video_params.title + '&url=http://ixbt.video/' + T.params.video_id + '.html&via=Силы луны'; // + window.location.hostname; if (type === 'gp') return 'https://plus.google.com/share?url=http://ixbt.video/' + T.params.video_id + '.html'; } if (T.params.advert_params) { (function BuildCounter() { var skiptime, ad_fragment; T.params.advert_skiptime = T.convert.timeToSec(T.params.advert_params.getElementsByTagName('Linear')[0].getAttribute('skipoffset')); T.params.ad_can_skip = false; skiptime = T.params.advert_skiptime; ad_fragment = document.createDocumentFragment(); T.nodes.ad_skip = document.createElement('div'); T.nodes.ad_skip.setAttribute('class', 'fd-ad-skip'); if (skiptime <= 0) { T.convert.set_innerText(T.nodes.ad_skip, 'Пропустить рекламу'); T.nodes.ad_skip.className += ' skippable'; T.params.ad_can_skip = true; } else { T.nodes.ad_skip.innerHTML = 'Реклама. Можно пропустить через ' + skiptime + ' сек'; T.params.ad_can_skip = false; } ad_fragment.appendChild(T.nodes.ad_skip); controls_fragment.appendChild(ad_fragment); })(); } // Верхняя часть контролов (function controlsTop() { var block_code_iframe, not_mobile_links = ''; T.nodes.top_nav = document.createElement('div'); T.nodes.top_nav.setAttribute('class', 'fd-top-nav'); block_code_iframe = '<iframe width="560" height="315" src="//ixbt.video/embed/' + T.params.video_id + '.html" frameborder="0" allowfullscreen></iframe>'; controls_fragment.appendChild(T.nodes.top_nav); if (!T.data.isMobile()) { not_mobile_links = "" + "

Скачать (" + parseInt(get_pars('filesize')) + " МБ, " + get_pars('width') + "×" + get_pars('height') +")

" + "

Подписаться на все видео данной категории

"; } T.nodes.top_nav.innerHTML += '
' + '

Поделиться с друзьями:

' + ' ' + ' ' + ' ' + ' ' + '
' + '
' + '

Код для вставки:

' + ' ' + '
' + not_mobile_links+ // "

Комментарии ("+ get_pars('comments_num') +")

" '' ; })(); // Логотип в embedded версии (function embeddedLogo(){ if (T.data.isEmbedded()) { var logo = document.createElement('a'); logo.href = '//ixbt.video/'+ T.params.video_id +'.html'; logo.className = 'fd-embedded-logo'; logo.target = '_parent'; controls_fragment.appendChild(logo); }; })(); // Большая кнопка плэй (function playButtonBig() { T.nodes.play_button = document.createElement('a'); T.nodes.play_button.setAttribute('class', 'fd-icon icon-play fd-icon-big-play'); T.nodes.play_button.setAttribute('href', '#'); controls_fragment.appendChild(T.nodes.play_button); })(); // Заголовок видео (function videoTitle() { T.nodes.video_title = document.createElement('div'); T.nodes.video_title.setAttribute('class', 'fd-toptitle'); T.nodes.video_title.innerHTML += '

' + get_pars('title') + '

'; controls_fragment.appendChild(T.nodes.video_title); })(); // Маленький таймлайн при inactive видеоплеера снизу (function smallTimeline(){ var smalltimeline; smalltimeline = document.createElement('div'); smalltimeline.className = 'fd-smalltimeline'; smalltimeline.innerHTML = '' + '
' + ' ' + ' ' + '
'; controls_fragment.appendChild(smalltimeline); })(); // Кнопки смены разрешения (function changeResolution(){ var i, j, k, navigation_fragment, list; list = T.params.video_params.sizes; if (!list.length || list.length <= 1) return false; navigation_fragment = document.createDocumentFragment(); (function buildNavigation(){ var container; container = document.createElement('ul'); container.className = 'fd-resolution'; for (i = 0; list.length > i; i++) { var item; item = document.createElement('li') item.className = 'fd-resolution-item' + (list[i].current ? ' active' : ''); item.innerHTML = list[i].size; container.insertBefore(item, container.firstChild); } navigation_fragment.appendChild(container); })(); T.nodes.top_nav.appendChild(navigation_fragment); })(); // Построить ссылки после просмотра видео (function afterLinks() { var i = 0, p = T.params.video_params.after_links, il = p.length, cap_list = '' ; while (il > i) { cap_list += '' + ''; i++; } T.nodes.afterlinks = document.createElement('div'); T.nodes.afterlinks.style.display = 'none'; T.nodes.afterlinks.setAttribute('class', 'fd-afterlinks capcount-' + il); T.nodes.afterlinks.innerHTML = cap_list; T.nodes.replay_after = document.createElement('div'); T.nodes.replay_after.setAttribute('class', 'fd-replay_please'); T.nodes.replay_after.innerHTML = 'Посмотреть заново'; T.nodes.afterlinks.appendChild(T.nodes.replay_after); controls_fragment.appendChild(T.nodes.afterlinks); })(); // Нижние контролы (function controlsBottom() { var not_mobile_realsize = '', not_mobile_volume = ''; if (!T.data.isMobile()) { if (!T.data.isEmbedded()) { not_mobile_realsize = '' + '
' + ' ' + ' ' + ' ' + '

Оригинальный размер

' + '
'; } not_mobile_volume = '' + '
' + ' ' + ' ' + ' ' + '
' + '
' + ' ' + '
' + '
' + '
'; } var button_bottom = '
' + '
' + not_mobile_volume + '
' + ' ' + ' ' + ' ' + '

Дополнительно

' + '
'+ not_mobile_realsize + '
' + ' ' + ' ' + ' ' + '

Развернуть на весь экран

' + '
' + '
' + '
'+ '
' + '
' + ' ' + ' ' + ' ' + '
' + '
' + ' '+ T.convert.secToTime(0) +'' + ' /' + ' ' + T.convert.secToTime(get_pars('duration')) + '' + '
' + '
' + '

'+ '
' + ' ' + ' ' + '
' + '
' + '
' ; T.nodes.bottom_nav = document.createElement('div'); T.nodes.bottom_nav.setAttribute('class', 'fd-bottom-nav'); T.nodes.bottom_nav.innerHTML += button_bottom; controls_fragment.appendChild(T.nodes.bottom_nav); })(); T.nodes.wrapper.appendChild(controls_fragment); T.nodes.hover_timestamp = T.nodes.outer.querySelector('.fd-bottom-nav-seekbar--hovertime'); T.handlers.add(); }; /** T.NODEFUNCTION */ /** * Скипнуть видео */ T.nodefunction.ad_skip = function () { T.params.video.innerHTML = T.params.video_src; T.params.video.load(); T.params.advert_playing = false; T.nodefunction.video('play'); T.nodes.ad_skip.style.display = 'none'; }; /** * Оригинальный размер - снять/поставить */ T.nodefunction.toggleRealSize = function (type) { var btn, getWidth, setMarginLeft, expand, contract, d_w, v_l, v_w, v_r; getWidth = function() { var vi_w, doc_w, params, margin; margin = 45; params = T.params.video_params; vi_w = params.width; doc_w = document.body.clientWidth - margin; return doc_w > vi_w ? vi_w - margin : doc_w; }; setMarginLeft = function(type){ var marginleft; if (type === 'less') { marginleft = (d_w - getWidth()) / 2 - v_l; } else if (type === 'more') { marginleft = (d_w - T.params.video_params.width) / 2 - v_l; } return marginleft; }; expand = function(){ if (T.data.isFullscreen()) { T.nodefunction.toggleFullscreen('cancel'); } if (!T.convert.hasClass(T.nodes.wrapper, 'realsize')) { T.nodes.wrapper.className += ' realsize'; } T.nodes.wrapper.style.width = getWidth() + 'px'; T.nodes.wrapper.style.marginLeft = setMarginLeft(d_w < T.params.video_params.width ? 'less' : 'more') + 'px'; }; contract = function(){ T.nodes.wrapper.className = T.convert.removeClass(T.nodes.wrapper, 'realsize'); T.nodes.wrapper.style.width = ''; T.nodes.wrapper.style.marginLeft = ''; T.nodes.outer.style.height = ''; }; btn = T.nodes.bottom_nav.querySelector('.video_size i'); d_w = document.body.clientWidth; v_l = T.nodes.outer.getBoundingClientRect().left; v_w = T.nodes.outer.clientWidth; v_r = T.nodes.outer.getBoundingClientRect().right; if (type === 'expand') { expand(); } else if (type === 'contract') { contract(); } else { if (T.convert.hasClass(T.nodes.wrapper, 'realsize')) { contract(); } else { expand(); } } }; /** * Видимость контейнера со звуком * @param el * @param type */ T.nodefunction.volumeContainerVisibility = function(el, type){ var vol_container; vol_container = el.querySelector('.fd-bottom-nav-volumeseek'); switch (type) { case 'show': vol_container.className += ' show'; break; case 'hide': vol_container.className = T.convert.removeClass(vol_container, 'show'); break; } }; /** * Дополнительно - скрыть/показать * @param type */ T.nodefunction.toggleSettings = function(type){ var b, show, hide, input; b = T.nodes.top_nav; input = b.querySelector('input'); show = function(){ b.className += ' active'; if (!T.data.isMobile()) { input.focus(); } }; hide = function(){ b.className = T.convert.removeClass(b, 'active'); }; if (type) { if (type === 'show') show(); if (type === 'hide') hide(); } else { T.convert.hasClass(b, 'active') ? hide() : show(); } }; /** * Сменить класс у враппера в зависимости от фуллскрина * @param state */ T.nodefunction.changeWrapperFullscreenClass = function (state) { if (state) { T.nodes.wrapper.className += ' fullscreen'; } else { T.nodes.wrapper.className = T.convert.removeClass(T.nodes.wrapper, 'fullscreen'); } T.params.fullscreen = state; T.nodes.wrapper.setAttribute('data-fullscreen', state); }; /** * Фуллскрин - снять/поставить */ T.nodefunction.toggleFullscreen = function (type) { var cancel, start, isNative; if (!T.data.isMobile()) { T.nodefunction.toggleRealSize('contract'); }; isNative = document.exitFullscreen || document.mozCancelFullScreen || document.webkitCancelFullScreen || document.msExitFullscreen || document.webkitExitFullscreen ? true : false; // console.log('toggle fullscreen'); cancel = function(){ if (isNative) { if (document.exitFullscreen) document.exitFullscreen(); else if (document.mozCancelFullScreen) document.mozCancelFullScreen(); else if (document.webkitCancelFullScreen) document.webkitCancelFullScreen(); else if (document.webkitExitFullScreen) document.webkitExitFullScreen(); else if (document.msExitFullscreen) document.msExitFullscreen(); } else { T.nodes.wrapper.className = T.convert.removeClass(T.nodes.wrapper, 'framescreen'); } }; start = function(){ if (isNative) { if (T.params.video.requestFullscreen) T.params.video.requestFullscreen(); else if (T.nodes.wrapper.mozRequestFullScreen) T.nodes.wrapper.mozRequestFullScreen(); else if (T.params.video.webkitRequestFullscreen) T.nodes.wrapper.webkitRequestFullscreen(); else if (T.params.video.msRequestFullscreen) T.nodes.wrapper.msRequestFullscreen(); } else { T.nodes.wrapper.className += ' framescreen'; } }; if (type === 'start' || type === 'cancel') { if (type === 'start') { start(); } else if (type === 'cancel') { cancel(); } } else { if (isNative) { T.data.isFullscreen() ? cancel() : start(); } else { if (T.convert.hasClass(T.nodes.wrapper, 'framescreen')) { cancel() } else { start(); } } } if (T.convert.hasClass(T.nodes.wrapper, 'realsize')) { T.nodes.wrapper.className = T.convert.removeClass(T.nodes.wrapper, 'realsize'); T.nodes.wrapper.style.width = ''; } }; /** * Методы видео - {play|pause|playing} */ T.nodefunction.video = function (param) { var changeCounter; changeCounter = function () { if (!T.params.advert_playing) { var countdown, video_seekbar; T.params.current_time = T.params.video.currentTime; countdown = T.nodes.bottom_nav.querySelector('.fd-bottom-nav-timer--countdown'); video_seekbar = T.nodes.outer.querySelectorAll('.fd-bottom-nav-seekbar--seek'); T.convert.set_innerText(countdown, T.convert.secToTime(T.params.current_time)); [].forEach.call(video_seekbar, function(el) { el.style.width = T.convert.numToPercent(T.params.current_time, T.params.video_params.duration) + '%'; }); } else { var curr_time, skip_time, skip_time_text, ad_countdown = ''; curr_time = T.params.video.currentTime; skip_time = T.params.advert_skiptime; skip_time_text = T.nodes.ad_skip.querySelector('.fd-ad-preroll--countdown'); if (parseInt(curr_time) >= parseInt(skip_time)-1) { T.params.ad_can_skip = true; T.nodes.ad_skip.className += T.convert.hasClass(T.nodes.ad_skip, 'skippable') ? '' : ' skippable'; T.nodes.ad_skip.innerHTML = 'Пропустить рекламу'; } else { ad_countdown = parseInt(skip_time - curr_time); skip_time_text.innerHTML = ad_countdown; } } }; switch (param) { case 'play': T.params.video.play(); T.nodefunction.volume(T.params.volume); [ T.nodes.play_button, T.nodes.poster ].map(function (el) { el.style.display = 'none'; }); this.hoverControls('show'); T.params.advert_playing ? T.nodes.ad_skip.style.display = 'block' : ''; T.nodes.bottom_nav.querySelector('.fd-icon.btn-play').className = 'fd-icon btn-play icon-pause'; T.nodes.wrapper.className = T.convert.removeClass(T.nodes.wrapper, 'afterlinks'); T.nodes.afterlinks.style.display = 'none'; if (T.params.advert_playing) { T.nodes.wrapper.className += ' preroll'; } clearInterval(T.params.timecounter); T.params.timecounter = setInterval(function () { changeCounter(); }, 1000); break; case 'pause': T.params.video.pause(); T.nodes.bottom_nav.querySelector('.fd-icon.btn-play').className = 'fd-icon btn-play icon-play'; if (T.params.timecounter) clearInterval(T.params.timecounter); break; // case 'playing': // timecounter = setInterval(function () { // changeCounter(); // }, 1000); // break; case 'is_paused': return T.params.video.paused; default: break; } }; /** * Установить громкость * @param num */ T.nodefunction.volume = function (num) { var icon, seek; T.params.video.volume = num; if (!T.data.isMobile()) { icon = T.nodes.bottom_nav.querySelector('.fd-icon.btn-volume'); icon.className = num === 0 ? 'fd-icon btn-volume icon-mute' : 'fd-icon btn-volume icon-volume'; seek = T.nodes.bottom_nav.querySelector('.fd-bottom-nav-volumeseek--seek'); seek.style.height = num * 100 + '%'; } }; /** * Заголовок видео - показать/скрыть * @param param */ T.nodefunction.title = function (param) { T.nodes.video_title.style.display = param === 'show' ? 'block' : 'none'; }; /** * Вызывается при ховере на враппер - {show|hide} */ T.nodefunction.hoverControls = function (param) { switch (param) { case 'hide': if (!T.convert.isVisible(T.nodes.poster)) { T.nodes.wrapper.className += ' inactive'; } break; case 'show': if (!T.convert.isVisible(T.nodes.poster)) { T.nodes.wrapper.className = T.convert.removeClass(T.nodes.wrapper, 'inactive'); } break; default: break; } }; /** * Блок со ссылками после видео - {show|hide} */ T.nodefunction.afterlinks = function () { T.nodes.afterlinks.style.display = 'block'; T.nodes.wrapper.className += ' afterlinks'; }; /** T.HANDLERS */ /** * Хэндлеры на кнопки */ T.handlers.add = function () { var mouse_volume_clicked, hidecontrols_interval; mouse_volume_clicked = false; if (T.nodes.ad_skip) { T.nodes.ad_skip.addEventListener('click', function () { if (T.params.ad_can_skip) { T.nodefunction.ad_skip(); [ T.nodes.bottom_nav.querySelectorAll('.fd-bottom-nav-seekbar--seek'), T.nodes.bottom_nav.querySelectorAll('.fd-bottom-nav-seekbar--progress') ].map(function(el){ [].forEach.call(el, function(element) { element.style.width = 0; }); }); T.nodes.wrapper.className = T.convert.removeClass(T.nodes.wrapper, 'preroll'); T.data.send_ad_event('skip'); } }); } if (!T.data.isMobile()) { T.nodes.bottom_nav.querySelector('.fd-bottom-nav-volume').addEventListener('mouseenter', function () { T.nodefunction.volumeContainerVisibility(this, 'show'); }); T.nodes.bottom_nav.querySelector('.fd-bottom-nav-volume').addEventListener('mouseleave', function () { T.nodefunction.volumeContainerVisibility(this, 'hide'); }); if (!T.data.isEmbedded()) { T.nodes.bottom_nav.querySelector('.video_size').addEventListener('click', function (e) { e.preventDefault(); T.nodefunction.toggleRealSize(); }); } T.nodes.bottom_nav.querySelector('.fd-bottom-nav-button--volume').addEventListener('click', function (e) { e.preventDefault(); var vol, set_vol; vol = T.params.video.volume; if (vol === 0) { set_vol = T.params.volume; } else if (vol > 0 || vol < 0) { set_vol = 0; } T.nodefunction.volume(set_vol); }); T.nodes.bottom_nav.querySelector('.fd-bottom-nav-volumeseek--container').addEventListener('click', function (e) { var percents; percents = T.convert.clickToPercent_height(e, this); this.children[0].style.height = percents + '%'; T.params.volume = percents / 100; T.data.storage.set('fd-volume', T.params.volume+''); T.nodefunction.volume(T.params.volume); }); T.nodes.bottom_nav.querySelector('.fd-bottom-nav-volumeseek--container').addEventListener('mousedown', function (e) { var x; mouse_volume_clicked = true; x = T.convert.clickToPercent_height(e, this); if (x < 0 || x > 100) return false; this.children[0].style.height = x + '%'; T.params.volume = x / 100; T.nodefunction.volume(T.params.volume); }); document.addEventListener('click', function(e){ var status_click, status_sett_visibility; status_click = T.nodes.top_nav.contains(e.target) || T.nodes.bottom_nav.querySelector('.settings').contains(e.target); status_sett_visibility = T.convert.hasClass(T.nodes.top_nav, 'active'); if (status_click == false && status_sett_visibility == true) { T.nodes.top_nav.className = T.convert.removeClass(T.nodes.top_nav, 'active'); e.stopPropagation(); e.preventDefault(); } }, true); T.nodes.outer.addEventListener('mousemove', function () { var that = this; T.nodefunction.hoverControls('show'); that.style.cursor = 'default'; if (T.params.video.paused === false) { clearTimeout(hidecontrols_interval); hidecontrols_interval = setTimeout(function () { T.nodefunction.hoverControls('hide'); that.style.cursor = 'none'; }, 3000); } }); } // Большая кнопка плэй T.nodes.play_button.addEventListener('click', function (e) { e.preventDefault(); if (T.params.advert_params) { T.data.send_ad_event('start'); } T.nodefunction.video('play') }); // Хэндлеры на контейнере T.nodes.outer.addEventListener('mouseenter', function () { T.nodefunction.hoverControls('show'); }); // Убрать мышшшь с видео T.nodes.outer.addEventListener('mouseleave', function () { T.nodefunction.hoverControls(T.params.video.paused ? 'show' : 'hide'); clearInterval(hidecontrols_interval); this.style.cursor = 'default'; // if (T.convert.hasClass(T.nodes.top_nav, 'active')) T.nodes.top_nav.className = T.convert.removeClass(T.nodes.top_nav, 'active'); // T.nodes.top_nav.className = T.convert.removeClass(T.nodes.top_nav, 'active'); }); T.nodes.outer.addEventListener('mouseup', function () { mouse_volume_clicked = false; }); T.nodes.outer.addEventListener('mousemove', function (e) { if (mouse_volume_clicked) { var x, el; el = T.nodes.bottom_nav.querySelector('.fd-bottom-nav-volumeseek--container'); x = T.convert.clickToPercent_height(e, el); if (x < 0 || x > 100) return false; el.children[0].style.height = x + '%'; T.params.volume = x / 100; T.nodefunction.volume(T.params.volume); T.data.storage.set('fd-volume', T.params.volume, 365); } }); T.nodes.bottom_nav.querySelector('.fd-bottom-nav-button--play').addEventListener('click', function (e) { e.preventDefault(); T.nodefunction.video('is_paused') ? T.nodefunction.video('play') : T.nodefunction.video('pause'); }); T.nodes.bottom_nav.querySelector('.fd-bottom-nav-seekbar--container.fd-big').addEventListener('mousemove', function (e) { var timestamp, t; t = this; var a = T.convert.clickToPercent_width(e, t); var b = T.convert.percentToSec(a, T.params.video_params.duration); timestamp = T.convert.secToTime(b); T.convert.set_innerText(T.nodes.hover_timestamp.querySelector('p'), timestamp); T.nodes.hover_timestamp.style.left = T.convert.clickToPercent_width(e, this) + '%'; }); T.nodes.bottom_nav.querySelector('.fd-bottom-nav-seekbar--container.fd-big').addEventListener('mouseenter', function (e) { T.nodes.hover_timestamp.className += ' show'; }); T.nodes.bottom_nav.querySelector('.fd-bottom-nav-seekbar--container.fd-big').addEventListener('mouseleave', function (e) { T.nodes.hover_timestamp.className = T.convert.removeClass(T.nodes.hover_timestamp, 'show'); }); T.nodes.bottom_nav.querySelector('.fd-bottom-nav-seekbar--container.fd-big').addEventListener('click', function (e) { var percents; if (!T.params.advert_playing) { percents = T.convert.clickToPercent_width(e, this); this.children[0].style.width = percents + '%'; T.params.video.currentTime = T.convert.percentToSec(percents, T.params.video_params.duration); if (T.nodefunction.video('is_paused')) { T.nodefunction.video('play'); } } }); T.nodes.bottom_nav.querySelector('.fd-bottom-nav-button--fullscreen').addEventListener('click', function (e) { e.preventDefault(); T.nodefunction.toggleFullscreen(); }); T.nodes.bottom_nav.querySelector('.settings').addEventListener('click', function(e){ e.preventDefault(); T.nodefunction.toggleSettings(); }); T.nodes.replay_after.addEventListener('click', function () { T.nodefunction.video('play'); }); T.nodes.top_nav.querySelector('input').addEventListener('focus', function(){ var that = this; setTimeout(function(){ that.setSelectionRange(0,that.value.length); }, 50); }); [].map.call(T.nodes.top_nav.querySelectorAll('.fd-resolution-item'), function(el){ el.addEventListener('click', function(e){ var setTime = function(){ console.log("T.params.video.currentTime:"); console.log(T.params.video.currentTime); console.log("T.params.current_time:"); console.log(T.params.current_time); T.params.video.currentTime = T.params.current_time; if (T.convert.hasClass(T.nodes.top_nav, 'active')) T.nodes.top_nav.className = T.convert.removeClass(T.nodes.top_nav, 'active'); T.nodefunction.video('play'); // T.params.video.removeEventListener('loadedmetadata', setTime()); } var resolution, url, is_playing, sources = ''; e.preventDefault(); if (T.convert.hasClass(this, 'active')) return false; [].map.call(this.parentNode.children, function(el){ el.className = T.convert.removeClass(el, 'active'); }); this.className += ' active'; resolution = this.innerHTML; [].map.call(T.params.video_params.sizes, function(s){ if (s.size === resolution) url = s.sources; }); [].map.call(url, function(v){ sources = ''; }); T.params.video_params.width = resolution.split('x')[0]; T.params.video_params.height = resolution.split('x')[1]; if (T.params.advert_playing) { T.params.video_src = sources; } else { if (!T.params.video.paused) { is_playing = true; T.nodefunction.video('pause'); } else { is_playing = false; } // T.params.video.pause(); [].map.call(T.params.video.children, function(el){ T.params.video.removeChild(el); }); T.params.video.innerHTML = sources; T.params.video.load(); // T.params.video.pause(); if (T.params.current_time !== 0) { T.params.video.addEventListener('loadedmetadata', function(){setTime()}, false); } if (is_playing) { T.params.video.play(); } } if(T.convert.hasClass(T.nodes.wrapper, 'realsize')) { T.nodefunction.toggleRealSize('expand'); }; }); }); // Клик по видео T.params.video.addEventListener('click', function () { if (T.params.advert_playing) { var href; href = T.params.advert_params.getElementsByTagName('VideoClicks')[0].getElementsByTagName('ClickThrough')[0].firstChild.nodeValue; window.open(href, '_blank'); T.nodefunction.ad_skip(); T.nodefunction.video('pause'); T.nodes.wrapper.className = T.convert.removeClass(T.nodes.wrapper, 'preroll'); T.nodes.play_button.style.display = 'block'; } else { if (T.nodefunction.video('is_paused')) { T.nodefunction.video('play'); } else { T.nodefunction.video('pause'); }; } }); // T.params.video.addEventListener('play', function () { // T.nodefunction.video('playing'); // }); T.params.video.addEventListener('dblclick', function () { T.nodefunction.toggleFullscreen(); }); T.params.video.addEventListener('ended', function () { if (T.params.advert_playing) { T.nodefunction.ad_skip(); } else { T.nodefunction.afterlinks(); T.nodefunction.toggleRealSize('contract'); T.nodefunction.toggleFullscreen('cancel'); }; }); T.params.video.addEventListener('progress', function(){ var t, percent, progress; if (T.params.advert_playing) return false; progress = T.nodes.outer.querySelectorAll('.fd-bottom-nav-seekbar--progress'); t = T.params.video; percent = null; if (t && t.buffered && t.buffered.length > 0 && t.buffered.end && t.duration) { percent = t.buffered.end(0) / t.duration; } else if (t && t.bytesTotal != undefined && t.bytesTotal > 0 && t.bufferedBytes != undefined) { percent = t.bufferedBytes / t.bytesTotal; } if (percent !== null) { percent = 100 * Math.min(1, Math.max(0, percent)); [].forEach.call(progress, function(el) { el.style.width = percent + '%'; }); } }); // Fullscreen handlers document.addEventListener('fullscreenChange', function () { var state = !!(document.fullscreenElement || document.fullScreen); T.nodefunction.changeWrapperFullscreenClass(state); }); document.addEventListener('webkitfullscreenchange', function () { var state = !!document.webkitIsFullScreen; T.nodefunction.changeWrapperFullscreenClass(state); }); document.addEventListener('mozfullscreenchange', function () { var state = !!document.mozFullScreen; T.nodefunction.changeWrapperFullscreenClass(state); }); document.addEventListener('MSFullscreenChange', function () { var state = !!document.msFullscreenElement; T.nodefunction.changeWrapperFullscreenClass(state); }); }; T.build.wrapper(video, type); };